其他

用R语言对大气污染物PM10进行统计分析

2017-11-09 郭小龙 R语言中文社区

作者:郭小龙,R语言中文社区专栏作者。知乎专栏:https://www.zhihu.com/people/guo-xiao-long-3-18/posts


1、数据来源

中部某城市2011年1月的大气污染物PM10的逐小时实况监测值,excel格式文档。实际8个监测点,按A、B、C、D、E、F、G、H字母代替。

PM10是指可吸入颗粒物,别名飘尘,通常是指粒径在10微米以下的颗粒物。测量单位为毫克/立方米。

2、分析目的

用R语言进行统计分析,分别计算不同站点的平均值、四分位数、标准差、标准分。通过不同值的差异对比,分析四个指标的实际意义。

3、R语言统计分析计算

3.1 数据预处理

首先,将xls文档转化为CSV格式文档进行读取,直接用函数read.xlsx()读取时,发现该函数只能读属性为xlsx文档,不能读取属性为xls文档。

其次,进行PM10字段的选取,无效数据的剔除,不同监测站点的替换以及数据格式转化等数据预处理工作。代码如下:

###读取Excels数据 library(openxlsx) library(plyr) Airdata <- read.csv("G:/统计概率学习实践/第二关实践作业/data/taiyuan201101.csv") ###数据预处理 #data <- Airdata[,c(1:5,9)]   ##这种写法也完全正确 data <- Airdata[,-(6:8)] data$pm <- data$pm * 1000 data1 <- data[data$pm > 0,] names(data1)[6] <- "pm10" z <- data1[,1] data1$zh[z == 1] <- "A" data1$zh[z == 2] <- "B" data1$zh[z == 3] <- "C" data1$zh[z == 4] <- "D" data1$zh[z == 5] <- "E" data1$zh[z == 7] <- "F" data1$zh[z == 8] <- "G" data1$zh[z == 9] <- "H"

3.2 PM10浓度平均值的计算

平均值的含义不做解释了。

本次分析时使用tapply()和mean()函数对不同站点的均值和所有站点均值都进行了计算,跟后面计算的四分位数、标准差等数值一块单独生成一个新的数据框。图表后面列出。

##(1)计算不同站点pm10浓度的平均值 ##按站点分组计算后生成一个新数据框 ss <- tapply(data1$pm10,data1$zh,mean) zhan <- c("A","B","C","D","E","F","G","H") date <-c("201101","201101","201101","201101","201101","201101","201101","201101") avg <- ss datanew <- data.frame(zhan,date,avg) Datamean <- round((mean(datanew$avg)),0)

3.3 四分位数的计算

四分位数定义:在统计学中把所有数值由小到大排列并分成四等份够,处于三个分割点(0.25、0.5、0.75)位置的数值。

(1)计算所有站点的PM10浓度数值的四分位数,并绘制箱线图。

##(2)计算不同站点pm10浓度的四分位数 #####计算所有数据的四分位数 Datafen <- quantile(data1$pm10,c(0.25,0.5,0.75)) Datazhong <- median(data1$pm10) Datamin <- min(data1$pm10) Datamax <- max(data1$pm10) boxplot(data1$pm10,main="箱线图",ylab="pm10浓度值")

(2)计算不同站点的四分位数,绘制箱线图对比。

#####计算不同站点数据的四分位数 #对比下不同站点中位数与均值的差异 DatazhongA <- median(data1$pm10[data1$zh == "A"]) DatazhongB <- median(data1$pm10[data1$zh == "B"]) DatazhongC <- median(data1$pm10[data1$zh == "C"]) DatazhongD <- median(data1$pm10[data1$zh == "D"]) DatazhongE <- median(data1$pm10[data1$zh == "E"]) DatazhongF <- median(data1$pm10[data1$zh == "F"]) DatazhongG <- median(data1$pm10[data1$zh == "G"]) DatazhongH <- median(data1$pm10[data1$zh == "H"]) zhong <- c(DatazhongA,DatazhongB,DatazhongC,DatazhongD,DatazhongE,DatazhongF,DatazhongG,DatazhongH) datanew1 <- cbind(datanew,zhong) boxplot(pm10 ~ zh,data = data1,main = "不同站点PM10浓度箱线图",        xlab = "Different Location",        ylab = "pm10浓度值")

3.4 标准差的计算

标准差:是方差的算术平方根,用σ表示。标准差能反映一个数据集的离散程度。平均数相同的两组数据,标准差未必相同

用R语言计算PM10的标准差,计算方法如下:

##(3)计算不同站点pm10浓度的标准差 DatasdA <- round((sd(data1$pm10[data1$zh =="A"])),2) DatasdB <- round((sd(data1$pm10[data1$zh =="B"])),2) DatasdC <- round((sd(data1$pm10[data1$zh =="C"])),2) DatasdD <- round((sd(data1$pm10[data1$zh =="D"])),2) DatasdE <- round((sd(data1$pm10[data1$zh =="E"])),2) DatasdF <- round((sd(data1$pm10[data1$zh =="F"])),2) DatasdG <- round((sd(data1$pm10[data1$zh =="G"])),2) DatasdH <- round((sd(data1$pm10[data1$zh =="H"])),2) sd <- c(DatasdA,DatasdB,DatasdC,DatasdD,DatasdE,DatasdF,DatasdG,DatasdH) datanew2 <- cbind(datanew1,sd)

3.5 标准分的计算

标准分,是一种由原始分推导出来的相对地位量数,它是用来说明原始分在所属的那批分数中的相对位置的。

本次分析中对不同站点的平均值用scale()函数计算其标准分。

##(4)计算不同站点pm10浓度的标准分 score <- scale(datanew2$avg) result <- cbind(datanew2,score)

3.6 结果分析

上图从左到右,分别为站点、日期、平均值、中位数、标准差和标准分。


目前的环境监测中,站点的PM10浓度值是以多次监测的平均值计算,而中位数跟平均值还是有明显差异的。在此不评论方法优劣,只是从描述统计学的角度,用上表中数据说明平均值和中位数的差异。


上表中,标准差(sd)与平均值(avg)呈正相关性。同一时间段内,数据离散程度低,均值也相对较小,说明受外界影响的极端值较少,这在不同站点四分位箱线图中可以看得一目了然。这与实际情况也较为相符,站点附近有道路清扫、工地施工时飘起的扬尘能导致PM10的数据异常,计算时包含这些异常值可导致平均值增大。


从标准分(score)可以看出,A点正值最大,平均值最大;H点负值最大,平均值最小。根据标准分大小可以轻松判断不同站点的质量好坏。


特别说明:本次统计分析重在用R语言对PM10数据的描述统计分析计算方法,其结果和分析只是辅助说明这四个指标的异同之处。


公众号后台回复关键字即可学习

回复 R               R语言快速入门免费视频 
回复 统计          统计方法及其在R中的实现
回复 用户画像   民生银行客户画像搭建与应用 
回复 大数据      大数据系列免费视频教程
回复 可视化      利用R语言做数据可视化
回复 数据挖掘   数据挖掘算法原理解释与应用
回复 机器学习   R&Python机器学习入门 

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存